package 斗地主;

import java.util.*;

public class PokerGame3 {
    //        创建一个集合，用来添加牌的价值(要有键值和索引)
    static HashMap<String,Integer> hm=new HashMap<>();

    //    准备牌（牌盒）
    static ArrayList<String> list = new ArrayList<>();
//静态代码块：随着类的增加而增加，且只有一次变化
    static {
        String[] color = {"♥", "♠", "♦", "♣"};
        String[] number = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};

        for (String s : color) {
//            s代表着color集合中的每一个花色
            for (String string : number) {
//                String代表着number集合中的每一个数字
//                 list.add(s+string);则将花色和数字一一配对
                list.add(s+string);
            }
//            System.out.println(list);
        }
//        添加大小王
//      形式为：“ 大王”“ 小王”是为了在用substring截取的时候可以截取完整的大小王否则会截取“大，小”
        list.add(" 大王");
        list.add(" 小王");
//        指定牌的价值hm集合
//        对于不添加数字：1.牌上的数字到map集合中是否存在，若存在，获取价值，不存在，数字就是价值。
        hm.put("J",11);
        hm.put("Q",12);
        hm.put("K",13);
        hm.put("A",14);
        hm.put("2",15);
/*      hm.put("3",3);
        hm.put("4",4);
        hm.put("5",5);
        hm.put("6",6);
        hm.put("7",7);
        hm.put("8",8);
        hm.put("9",9);
        hm.put("10",10);*/
        hm.put("小王",50);
        hm.put("大王",100);
    }
    public PokerGame3(){
//        洗牌
        Collections.shuffle(list);

//        发牌
        ArrayList<String> load=new ArrayList<>();
        ArrayList<String> play1=new ArrayList<>();
        ArrayList<String> play2=new ArrayList<>();
        ArrayList<String> play3=new ArrayList<>();

//      遍历集合得到集合中的每一张牌并发牌
        for (int i = 0; i < list.size(); i++) {
//            得到集合中元素
            String s = list.get(i);
            if (i<=2){
                load.add(s);
                continue;
            }
            if (i%3==0){
                play1.add(s);
            } else if (i%3==1) {
                play2.add(s);
            }else {
                play3.add(s);
            }
        }
        /*
        System.out.println(load);
        System.out.println(play1);
        System.out.println(play2);
        System.out.println(play3);
        */
//        对牌进行排序(排大小)
        order(load);
        order(play1);
        order(play2);
        order(play3);
//        看牌：即遍历4个数组

        lookpoker("底牌",load);
        lookpoker("玩家一",play1);
        lookpoker("玩家二",play2);
        lookpoker("玩家三",play3);
    }

//利用牌的价值进行排序
    public void order(ArrayList<String>list){
//        自定义排序
        Collections.sort(list,new Comparator<String>(){
//            Array.sort（插入排序，二分查找）
            @Override
            public int compare(String o1, String o2) {
//              o1：表示当前要插入到有序序列中的牌
//              o2：表示已经在有序序列中存在的牌
//             负数(o1-o2)插入到o1前
//             正数(o1-o2)插入到o1后
//                0，代表着o1=o2，需要按照花色重新排列
                
//                计算o1的花色和价值
                String color1=o1.substring(0,1);//包头不包尾
                int value1=getValue(o1);
//                计算o2的花色和价值
                String color2=o2.substring(0,1);//包头不包尾
                int value2=getValue(o2);
//                比较o1和o2的价值
                int i = value1 - value2;
//                判断i的大小
                return i==0?color1.compareTo(color2):i;
            }
        });
    }
//    计算牌的价值
//    参数：牌
//    返回值：价值
    public int getValue(String poker){
//        获取牌上的数字
        String number = poker.substring(1);
//        拿着数字到map集合中判断是否存在
//        存在，获取价值
//        不存在：类型转换，牌的数字即为价值
        if (hm.containsKey(number)){
//            存在，返回价值
           return hm.get(number);
        }else {
//            不存在，类型转换
//            同时，若截取的是个“王”“小王”汉字类型的无法转换成整数，会报错
           return Integer.parseInt(number);
        }
    }
    public void lookpoker(String name,ArrayList<String>list){
        System.out.print(name+" ");

        for (String poker : list) {
            System.out.print(poker+" ");
        }
        System.out.println();
    }
}
